package com.example.rabbit.config;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 队列优先级
 * <p>
 * 两种情况
 * 1. 生产者发送消息，如果此时交换器出现异常，收不到消息，那么应该将消息缓存，生产者需要交换机确认收到了消息。【此时使用回调确认消息】
 * 2. 当交换机完好，队列出现了问题，那么【使用备份交换机中的队列来接收消息并处理】
 * ** 当同时设置并开启了 交换机回调确认 和 备份交换机，那么 [备份交换机优先级更高]。
 * ** 可以通过 controller 发送一条消息来确认，消息会直接进入备份交换机
 *
 * @Author ifredomvip@gmail.com
 **/
@Configuration
public class PriorityConfig {

    public static final String PRIORITY_EXCHANGE = "priority_exchange";
    public static final String PRIORITY_QUEUE = "priority_queue";
    public static final String PRIORITY_ROUTING_KEY = "priority_routingKey";

    @Bean(PRIORITY_EXCHANGE)
    public DirectExchange getConfirmExchange() {
        return ExchangeBuilder.directExchange(PRIORITY_EXCHANGE).build();
    }

    @Bean(PRIORITY_QUEUE)
    public Queue getConfirmQueue() {
        return QueueBuilder.durable(PRIORITY_QUEUE).maxPriority(10).build();
    }

    @Bean
    public Binding doBindingPriority(@Qualifier(PRIORITY_QUEUE) Queue queue, @Qualifier(PRIORITY_EXCHANGE) DirectExchange directExchange) {
        return BindingBuilder.bind(queue).to(directExchange).with(PRIORITY_ROUTING_KEY);
    }


}
